home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 9
/
FM Towns Free Software Collection 9.iso
/
t_os
/
tool
/
ugoku
/
src
/
vdsys
/
dv02sx.c
< prev
next >
Wrap
Text File
|
1994-11-16
|
37KB
|
1,516 lines
/*
V02 RECORD
for GUI
Hiroshi TODA
1993 9 3
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <file_dlg.h>
#include <egb.h>
#include <mos.h>
#include <snd.h>
#include "ugoku.h"
extern char *guiEgbPtr; /* EGB work */
extern int mouse( int );
/*
v02 direct save
*/
extern void v02_trans_128_0();
extern void v02_trans_160_0();
extern void v02_trans_192_0();
extern void v02_trans_256_0();
extern void v02_trans_320_0();
extern void v02_snd_trans_128_4( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_snd_trans_128_5( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_snd_trans_128_6( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_snd_trans_128_7( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_snd_trans_160_4( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_snd_trans_160_5( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_snd_trans_160_6( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_snd_trans_160_7( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_snd_trans_192_4( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_snd_trans_192_5( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_snd_trans_192_6( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_snd_trans_192_7( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_snd_trans_256_4( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_snd_trans_256_5( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_snd_trans_256_6( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_snd_trans_256_7( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_snd_trans_320_4( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_snd_trans_320_5( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_snd_trans_320_6( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_snd_trans_320_7( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_trans_128_9600( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_trans_128_19200( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_trans_160_9600( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_trans_160_19200( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_trans_192_9600( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_trans_192_19200( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_trans_256_9600( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_trans_256_19200( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_trans_320_9600( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern void v02_trans_320_19200( char *, int, char *, int, int, int,
char *, char *, char * ) ;
extern int v02_digit_timing_flag0[]; /* flag */
extern char *v02_digit_buf0[]; /* 圧縮データ転送先 */
extern int v02_digit_counter; /* conter */
extern int v02_digit_wait; /* wait */
extern char *v02_digit_work ; /* VRAMデータ一時保存領域 */
extern char *v02_digit_ytab ; /* Ytable */
extern char *v02_digit_ctab ; /* Ctable */
v02_digit_save_0( name, frame, md, wt, ytab, ctab, v02tab )
char *name ;
int frame, md, wt ;
char *ytab, *ctab, *v02tab ;
{
FILE *fp;
int v02xd = 128, v02yd = 96;
int i, j, n, f, size, skip, total, bind ;
char head[256], bind_head[32] ;
char *buf, *b[8]; /* buffer */
switch( md ){
case 1: v02xd = 128; v02yd = 96;
break;
case 2: v02xd = 160; v02yd = 120;
break;
case 3: v02xd = 192; v02yd = 144;
break;
case 4: v02xd = 256; v02yd = 192;
break;
case 5: v02xd = 320; v02yd = 240;
break;
default: return 58 ;
}
if(
( buf = (char *)TL_malloc( (16+v02xd*v02yd*2*3/8)*8 + v02xd*v02yd*2 ) )
== NULL
)return 7;
if( ( fp = fopen( name, "wb" ) ) == NULL ){
TL_free( buf );
return 2;
}
for( i= 0 ; i<8 ; i++ )
{
b[i] = buf + (16+v02xd*v02yd*2*3/8)*i ;
v02_digit_buf0[i] = b[i] + 16 ;
v02_digit_timing_flag0[i] = 0;
WORD( b[i] + 0 ) = 1 ;
WORD( b[i] + 2 ) = 0x2104 ;
DWORD( b[i] + 4 ) = 8 + v02xd*v02yd*2*3/8 ;
DWORD( b[i] + 8 ) = 1 ;
BYTE( b[i] + 12 ) = 0 ;
BYTE( b[i] + 13 ) = 0xff ;
WORD( b[i] + 14 ) = v02xd*v02yd*2*3/8 ;
}
v02_digit_counter = 0 ;
v02_digit_wait = wt;
v02_digit_work = buf + (16+v02xd*v02yd*2*3/8)*8 ;
v02_digit_ytab = ytab;
v02_digit_ctab = ctab;
for( i=0 ; i<64 ; i++ )DWORD( head + i*4 ) = 0;
DWORD( head ) = 0x32304456; /* ID = VD02 */
DWORD( head + 4 ) = 0 ; /* total length */
DWORD( head + 8 ) = 0 ; /* total frame */
DWORD( head + 12 ) = 6; /* dataの種類番号(bit/ピクセル) */
DWORD( head + 16 ) = v02xd; /* 横 */
DWORD( head + 20 ) = v02yd; /* 縦 */
DWORD( head + 24 ) = wt; /* wait */
DWORD( head + 28 ) = 8; /* バインダ内こま数 */
DWORD( head + 32 ) = 8000*6/wt; /* sound samp. freq */
DWORD( head + 36 ) = 6400; /* バインダ内snd data Byte数 */
if( fwrite( head, 256, 1, fp ) < 1 ){ /* ヘッダー */
fclose(fp);
TL_free( buf );
return 2; /* 2 = error num. */
}
if( fwrite( v02tab, 32768+512, 1, fp ) < 1 ){ /* v02 table */
fclose(fp);
TL_free( buf );
return 2; /* 2 = error num. */
}
switch( md ){
case 1: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,8,1);
EGB_digitize(guiEgbPtr,1);
size = v02xd*v02yd*2*3/8 + 16 ; /* frame size */
skip = 32 + 6400 ;
mouse(1);
SND_fm_timer_b_set( 0, 0 ) ;
VSYNC_init();
VSYNC_setEvent( v02_trans_128_0 );
f = 0 ;
for( i=0; i<frame; i += 8 )
{
fseek( fp, skip, SEEK_CUR );
if( frame - i >= 8 )
n = 8 ;
else
n = frame - i ;
for( j=0; j<n; j++ )
{
while( v02_digit_timing_flag0[j] == 0 );
if( fwrite( b[j], size, 1, fp ) < 1 )
break;
v02_digit_timing_flag0[j] = 0;
f++ ;
}
}
VSYNC_end();
SND_fm_timer_b_start() ;
break;
case 2: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,8,1);
EGB_digitize(guiEgbPtr,1);
size = v02xd*v02yd*2*3/8 + 16 ; /* frame size */
skip = 32 + 6400 ;
mouse(1);
SND_fm_timer_b_set( 0, 0 ) ;
VSYNC_init();
VSYNC_setEvent( v02_trans_160_0 );
f = 0 ;
for( i=0; i<frame; i += 8 )
{
fseek( fp, skip, SEEK_CUR );
if( frame - i >= 8 )
n = 8 ;
else
n = frame - i ;
for( j=0; j<n; j++ )
{
while( v02_digit_timing_flag0[j] == 0 );
if( fwrite( b[j], size, 1, fp ) < 1 )
break;
v02_digit_timing_flag0[j] = 0;
f++ ;
}
}
VSYNC_end();
SND_fm_timer_b_start() ;
break;
case 3: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,4,1);
EGB_digitize(guiEgbPtr,1);
size = v02xd*v02yd*2*3/8 + 16 ; /* frame size */
skip = 32 + 6400 ;
mouse(1);
SND_fm_timer_b_set( 0, 0 ) ;
VSYNC_init();
VSYNC_setEvent( v02_trans_192_0 );
f = 0 ;
for( i=0; i<frame; i += 8 )
{
fseek( fp, skip, SEEK_CUR );
if( frame - i >= 8 )
n = 8 ;
else
n = frame - i ;
for( j=0; j<n; j++ )
{
while( v02_digit_timing_flag0[j] == 0 );
if( fwrite( b[j], size, 1, fp ) < 1 )
break;
v02_digit_timing_flag0[j] = 0;
f++ ;
}
}
VSYNC_end();
SND_fm_timer_b_start() ;
break;
case 4: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,4,1);
EGB_digitize(guiEgbPtr,1);
size = v02xd*v02yd*2*3/8 + 16 ; /* frame size */
skip = 32 + 6400 ;
mouse(1);
SND_fm_timer_b_set( 0, 0 ) ;
VSYNC_init();
VSYNC_setEvent( v02_trans_256_0 );
f = 0 ;
for( i=0; i<frame; i += 8 )
{
fseek( fp, skip, SEEK_CUR );
if( frame - i >= 8 )
n = 8 ;
else
n = frame - i ;
for( j=0; j<n; j++ )
{
while( v02_digit_timing_flag0[j] == 0 );
if( fwrite( b[j], size, 1, fp ) < 1 )
break;
v02_digit_timing_flag0[j] = 0;
f++ ;
}
}
VSYNC_end();
SND_fm_timer_b_start() ;
break;
case 5: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,4,1);
EGB_digitize(guiEgbPtr,1);
size = v02xd*v02yd*2*3/8 + 16 ; /* frame size */
skip = 32 + 6400 ;
mouse(1);
SND_fm_timer_b_set( 0, 0 ) ;
VSYNC_init();
VSYNC_setEvent( v02_trans_320_0 );
f = 0 ;
for( i=0; i<frame; i += 8 )
{
fseek( fp, skip, SEEK_CUR );
if( frame - i >= 8 )
n = 8 ;
else
n = frame - i ;
for( j=0; j<n; j++ )
{
while( v02_digit_timing_flag0[j] == 0 );
if( fwrite( b[j], size, 1, fp ) < 1 )
break;
v02_digit_timing_flag0[j] = 0;
f++ ;
}
}
VSYNC_end();
SND_fm_timer_b_start() ;
break;
}
/* mute */
int s ;
SND_get_elevol_mute( &s ) ;
SND_elevol_mute( s & 0xfffffff3 ) ;
EGB_digitize(guiEgbPtr,0);
EGB_displayPage(guiEgbPtr,0,0);
EGB_color( guiEgbPtr, 1, 0 ) ;
EGB_clearScreen( guiEgbPtr ) ; /* 画面をきれいにしよう */
fseek( fp, 0, SEEK_SET );
fseek( fp, 256+32768+512, SEEK_CUR );
for( i=0 ; i<6400 ; i += 4 )
DWORD( buf + i ) = 0x80808080 ;
bind = 0 ;
for( i=0 ; i<f ; i += 8 )
{
if( f - i >= 8 )
n = 8 ;
else
n = f - i ;
for( j=0 ; j<8 ; j++ )DWORD( bind_head + j*4 ) = 0;
DWORD( bind_head ) = bind;
DWORD( bind_head + 4 ) = 6400 + (16 + v02xd*v02yd*2*3/8)*n ;
if( fwrite( bind_head, 32, 1, fp ) < 1 )
{
fclose(fp);
TL_free( buf );
return 2; /* 2 = error num. */
}
if( fwrite( buf, 6400, 1, fp ) < 1 )
{
fclose(fp);
TL_free( buf );
return 2; /* 2 = error num. */
}
if( n < 8 )
break ;
fseek( fp, (16 + v02xd*v02yd*2*3/8)*8, SEEK_CUR );
bind++ ;
}
/* total data size 修正 */
total = 32768 + 512 ;
if( f%8 )
total = total + (f/8 + 1)*(32+6400) ;
else
total = total + f/8*(32+6400) ;
total = total + f*(v02xd*v02yd*2*3/8 + 16) ;
fseek( fp, 0, SEEK_SET );
DWORD( head + 4 ) = total ; /* total length */
DWORD( head + 8 ) = f; /* total frame */
if( fwrite( head, 256, 1, fp ) < 1 ){ /* ヘッダー */
fclose(fp);
TL_free( buf );
return 2; /* 2 = error num. */
}
fclose(fp);
TL_free( buf );
if( f < frame )return 2;
else return 0;
}
/* サンプリングレート 9600 19200 サポート版(fq=0:9600 fq=1:19200) */
v02_digit_save_0_2( name, frame, md, fq, wt, ytab, ctab, v02tab )
char *name ;
int frame, md, fq, wt ;
char *ytab, *ctab, *v02tab ;
{
FILE *fp;
int v02xd = 128, v02yd = 96;
int i, j, n, f, freq, size, skip, total, bind ;
char head[256], bind_head[32] ;
char *buf, *b[8]; /* buffer */
switch( fq ){
case 0: freq = 9600 ;
break;
case 1: freq = 19200 ;
break;
default: return 58 ;
}
switch( md ){
case 1: v02xd = 128; v02yd = 96;
break;
case 2: v02xd = 160; v02yd = 120;
break;
case 3: v02xd = 192; v02yd = 144;
break;
case 4: v02xd = 256; v02yd = 192;
break;
case 5: v02xd = 320; v02yd = 240;
break;
default: return 58 ;
}
if(
( buf = (char *)TL_malloc( (16+v02xd*v02yd*2*3/8)*8 + v02xd*v02yd*2 ) )
== NULL
)return 7;
if( ( fp = fopen( name, "wb" ) ) == NULL ){
TL_free( buf );
return 2;
}
for( i= 0 ; i<8 ; i++ )
{
b[i] = buf + (16+v02xd*v02yd*2*3/8)*i ;
v02_digit_buf0[i] = b[i] + 16 ;
v02_digit_timing_flag0[i] = 0;
WORD( b[i] + 0 ) = 1 ;
WORD( b[i] + 2 ) = 0x2104 ;
DWORD( b[i] + 4 ) = 8 + v02xd*v02yd*2*3/8 ;
DWORD( b[i] + 8 ) = 1 ;
BYTE( b[i] + 12 ) = 0 ;
BYTE( b[i] + 13 ) = 0xff ;
WORD( b[i] + 14 ) = v02xd*v02yd*2*3/8 ;
}
v02_digit_counter = 0 ;
v02_digit_wait = wt;
v02_digit_work = buf + (16+v02xd*v02yd*2*3/8)*8 ;
v02_digit_ytab = ytab;
v02_digit_ctab = ctab;
for( i=0 ; i<64 ; i++ )DWORD( head + i*4 ) = 0;
DWORD( head ) = 0x32304456; /* ID = VD02 */
DWORD( head + 4 ) = 0 ; /* total length */
DWORD( head + 8 ) = 0 ; /* total frame */
DWORD( head + 12 ) = 7; /* dataの種類番号(mvbType) */
DWORD( head + 16 ) = v02xd; /* 横 */
DWORD( head + 20 ) = v02yd; /* 縦 */
DWORD( head + 24 ) = wt; /* wait */
DWORD( head + 28 ) = 8; /* バインダ内こま数 */
DWORD( head + 32 ) = freq; /* sound samp. freq */
DWORD( head + 36 ) = wt*freq/60*8; /* バインダ内snd data Byte数 */
if( fwrite( head, 256, 1, fp ) < 1 ){ /* ヘッダー */
fclose(fp);
TL_free( buf );
return 2; /* 2 = error num. */
}
if( fwrite( v02tab, 32768+512, 1, fp ) < 1 ){ /* v02 table */
fclose(fp);
TL_free( buf );
return 2; /* 2 = error num. */
}
switch( md ){
case 1: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,8,1);
EGB_digitize(guiEgbPtr,1);
size = v02xd*v02yd*2*3/8 + 16 ; /* frame size */
skip = 32 + wt*freq/60*8 ;
mouse(1);
SND_fm_timer_b_set( 0, 0 ) ;
VSYNC_init();
VSYNC_setEvent( v02_trans_128_0 );
f = 0 ;
for( i=0; i<frame; i += 8 )
{
fseek( fp, skip, SEEK_CUR );
if( frame - i >= 8 )
n = 8 ;
else
n = frame - i ;
for( j=0; j<n; j++ )
{
while( v02_digit_timing_flag0[j] == 0 );
if( fwrite( b[j], size, 1, fp ) < 1 )
break;
v02_digit_timing_flag0[j] = 0;
f++ ;
}
}
VSYNC_end();
SND_fm_timer_b_start() ;
break;
case 2: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,8,1);
EGB_digitize(guiEgbPtr,1);
size = v02xd*v02yd*2*3/8 + 16 ; /* frame size */
skip = 32 + wt*freq/60*8 ;
mouse(1);
SND_fm_timer_b_set( 0, 0 ) ;
VSYNC_init();
VSYNC_setEvent( v02_trans_160_0 );
f = 0 ;
for( i=0; i<frame; i += 8 )
{
fseek( fp, skip, SEEK_CUR );
if( frame - i >= 8 )
n = 8 ;
else
n = frame - i ;
for( j=0; j<n; j++ )
{
while( v02_digit_timing_flag0[j] == 0 );
if( fwrite( b[j], size, 1, fp ) < 1 )
break;
v02_digit_timing_flag0[j] = 0;
f++ ;
}
}
VSYNC_end();
SND_fm_timer_b_start() ;
break;
case 3: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,4,1);
EGB_digitize(guiEgbPtr,1);
size = v02xd*v02yd*2*3/8 + 16 ; /* frame size */
skip = 32 + wt*freq/60*8 ;
mouse(1);
SND_fm_timer_b_set( 0, 0 ) ;
VSYNC_init();
VSYNC_setEvent( v02_trans_192_0 );
f = 0 ;
for( i=0; i<frame; i += 8 )
{
fseek( fp, skip, SEEK_CUR );
if( frame - i >= 8 )
n = 8 ;
else
n = frame - i ;
for( j=0; j<n; j++ )
{
while( v02_digit_timing_flag0[j] == 0 );
if( fwrite( b[j], size, 1, fp ) < 1 )
break;
v02_digit_timing_flag0[j] = 0;
f++ ;
}
}
VSYNC_end();
SND_fm_timer_b_start() ;
break;
case 4: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,4,1);
EGB_digitize(guiEgbPtr,1);
size = v02xd*v02yd*2*3/8 + 16 ; /* frame size */
skip = 32 + wt*freq/60*8 ;
mouse(1);
SND_fm_timer_b_set( 0, 0 ) ;
VSYNC_init();
VSYNC_setEvent( v02_trans_256_0 );
f = 0 ;
for( i=0; i<frame; i += 8 )
{
fseek( fp, skip, SEEK_CUR );
if( frame - i >= 8 )
n = 8 ;
else
n = frame - i ;
for( j=0; j<n; j++ )
{
while( v02_digit_timing_flag0[j] == 0 );
if( fwrite( b[j], size, 1, fp ) < 1 )
break;
v02_digit_timing_flag0[j] = 0;
f++ ;
}
}
VSYNC_end();
SND_fm_timer_b_start() ;
break;
case 5: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,4,1);
EGB_digitize(guiEgbPtr,1);
size = v02xd*v02yd*2*3/8 + 16 ; /* frame size */
skip = 32 + wt*freq/60*8 ;
mouse(1);
SND_fm_timer_b_set( 0, 0 ) ;
VSYNC_init();
VSYNC_setEvent( v02_trans_320_0 );
f = 0 ;
for( i=0; i<frame; i += 8 )
{
fseek( fp, skip, SEEK_CUR );
if( frame - i >= 8 )
n = 8 ;
else
n = frame - i ;
for( j=0; j<n; j++ )
{
while( v02_digit_timing_flag0[j] == 0 );
if( fwrite( b[j], size, 1, fp ) < 1 )
break;
v02_digit_timing_flag0[j] = 0;
f++ ;
}
}
VSYNC_end();
SND_fm_timer_b_start() ;
break;
}
/* mute */
int s ;
SND_get_elevol_mute( &s ) ;
SND_elevol_mute( s & 0xfffffff3 ) ;
EGB_digitize(guiEgbPtr,0);
EGB_displayPage(guiEgbPtr,0,0);
EGB_color( guiEgbPtr, 1, 0 ) ;
EGB_clearScreen( guiEgbPtr ) ; /* 画面をきれいにしよう */
fseek( fp, 0, SEEK_SET );
fseek( fp, 256+32768+512, SEEK_CUR );
for( i=0 ; i<(wt*freq/60*8) ; i += 4 )
DWORD( buf + i ) = 0x80808080 ;
bind = 0 ;
for( i=0 ; i<f ; i += 8 )
{
if( f - i >= 8 )
n = 8 ;
else
n = f - i ;
for( j=0 ; j<8 ; j++ )DWORD( bind_head + j*4 ) = 0;
DWORD( bind_head ) = bind;
DWORD( bind_head + 4 ) = wt*freq/60*8 + (16 + v02xd*v02yd*2*3/8)*n ;
if( fwrite( bind_head, 32, 1, fp ) < 1 )
{
fclose(fp);
TL_free( buf );
return 2; /* 2 = error num. */
}
if( fwrite( buf, wt*freq/60*8, 1, fp ) < 1 )
{
fclose(fp);
TL_free( buf );
return 2; /* 2 = error num. */
}
if( n < 8 )
break ;
fseek( fp, (16 + v02xd*v02yd*2*3/8)*8, SEEK_CUR );
bind++ ;
}
/* total data size 修正 */
total = 32768 + 512 ;
if( f%8 )
total = total + (f/8 + 1)*(32+wt*freq/60*8) ;
else
total = total + f/8*(32+wt*freq/60*8) ;
total = total + f*(v02xd*v02yd*2*3/8 + 16) ;
fseek( fp, 0, SEEK_SET );
DWORD( head + 4 ) = total ; /* total length */
DWORD( head + 8 ) = f; /* total frame */
if( fwrite( head, 256, 1, fp ) < 1 ){ /* ヘッダー */
fclose(fp);
TL_free( buf );
return 2; /* 2 = error num. */
}
fclose(fp);
TL_free( buf );
if( f < frame )return 2;
else return 0;
}
v02_snd_save_0( name )
char *name ;
{
FILE *fp;
int i, count, f, wt, freq, total, bf, bsnd, stotal, sndp, bsize;
char head[256], bind_head[32] ;
char *buf ; /* buffer */
if( ( fp = fopen( name, "rb" ) ) == NULL ){
return 1;
}
if( fread( head, 256, 1, fp ) < 1 ){ /* ヘッダー */
fclose(fp);
return 1;
}
fclose(fp);
total = DWORD( head + 4 ) ; /* total length */
f = DWORD( head + 8 ); /* total frame */
wt = DWORD( head + 24 ); /* wait */
if( wt == 0 )
wt = 6 ;
bf = DWORD( head + 28 ); /* バインダ内こま数 */
if( bf == 0 )
bf = 8 ;
freq = DWORD( head + 32 ); /* sound samp. freq */
if( freq == 0 )
freq = 8000*6/wt ;
bsnd = DWORD( head + 36 ); /* バインダ内snd data Byte数 */
if( bsnd == 0 )
bsnd = 6400 ;
stotal = freq * f * wt / 60 ;
if( ( buf = (char *)TL_malloc( stotal + bsnd ) ) == NULL )
{
return 7;
}
for( i=0 ; i<bsnd-4 ; i += 4 )
DWORD( buf + stotal + i ) = 0x80808080 ;
/* 1バインダのクッションが必要 */
EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,4,1);
EGB_digitize(guiEgbPtr,1);
mouse(1);
interrupt_disable() ;
SND_pcm_rec( freq, buf, stotal, 0 );
interrupt_enable() ;
/* mute */
int s ;
SND_get_elevol_mute( &s ) ;
SND_elevol_mute( s & 0xfffffff3 ) ;
EGB_digitize(guiEgbPtr,0);
EGB_displayPage(guiEgbPtr,0,0);
EGB_color( guiEgbPtr, 1, 0 ) ;
EGB_clearScreen( guiEgbPtr ) ; /* 画面をきれいにしよう */
if( ( fp = fopen( name, "r+b" ) ) == NULL ){
return 2;
}
count = 256+32768+512 ;
if( count >= total + 256 )
{
TL_free( buf );
fclose(fp);
return 58;
}
sndp = 0 ;
for( i=0; i<f; i += bf )
{
fseek( fp, count, SEEK_SET );
if( fread( bind_head, 32, 1, fp ) < 1 )
{
fclose(fp);
TL_free( buf );
return 1;
}
count = count + 32 ;
if( count > total + 256 )
break ;
bsize = DWORD( bind_head + 4 ) ;
if( bsize <= bsnd )
break ;
if( sndp+bsnd < stotal )
{
fseek( fp, count, SEEK_SET );
if( fwrite( buf+sndp, bsnd, 1, fp ) < 1 )
{
fclose(fp);
TL_free( buf );
return 2;
}
sndp = sndp + bsnd ;
}
else
{
fseek( fp, count, SEEK_SET );
if( fwrite( buf+sndp, stotal-sndp, 1, fp ) < 1 )
{
fclose(fp);
TL_free( buf );
return 2;
}
break ;
}
count = count + bsize ;
if( count > total + 256 )
break ;
}
fclose(fp);
TL_free( buf );
return 0;
}
v02_digit_snd_save( name, frame, md, wt, ytab, ctab, v02tab )
char *name;
int frame, md, wt;
char *ytab, *ctab, *v02tab ;
{
FILE *fp;
int freq ;
int v02xd = 128, v02yd = 96;
int i, j, size, error;
char head[256], bind_head[32], data_top[16] ;
char *buf, *snd, *wk ; /* buffer */
error = 0;
switch( wt ){
case 4: freq = 12000 ;
break;
case 5: freq = 9600 ;
break;
case 6: freq = 8000 ;
break;
case 7: freq = 6857 ;
break;
default: return 58 ;
}
switch( md ){
case 1: v02xd = 128; v02yd = 96;
break;
case 2: v02xd = 160; v02yd = 120;
break;
case 3: v02xd = 192; v02yd = 144;
break;
case 4: v02xd = 256; v02yd = 192;
break;
case 5: v02xd = 320; v02yd = 240;
break;
default: return 58 ;
}
size = v02xd*v02yd*2; /* frame size */
if( ( buf = (char *)TL_malloc( size*frame*3/8 + size ) ) == NULL )
{
error = 7;
goto vd11;
}
wk = buf + size*frame*3/8 ;
if( ( snd = (char *)TL_malloc( frame*800 + 20000 ) ) == NULL )
{
error = 7;
goto vd10;
}
for( i=0 ; i<20000-100 ; i += 4 )
DWORD( snd + frame*800 + i ) = 0x80808080 ;
/* 1バインダ(v00タイプなら6400,mvbなら15360のクッションが必要 */
/* ここでは余裕をみて20K取っている */
switch( md ){
case 1: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,8,1);
EGB_digitize(guiEgbPtr,1);
mouse(1);
// SND_fm_timer_b_set( 0, 0 ) ;
switch( wt ){
case 4: v02_snd_trans_128_4( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
case 5: v02_snd_trans_128_5( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
case 6: v02_snd_trans_128_6( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
case 7: v02_snd_trans_128_7( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
}
// SND_fm_timer_b_start() ;
break;
case 2: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,8,1);
EGB_digitize(guiEgbPtr,1);
mouse(1);
// SND_fm_timer_b_set( 0, 0 ) ;
switch( wt ){
case 4: v02_snd_trans_160_4( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
case 5: v02_snd_trans_160_5( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
case 6: v02_snd_trans_160_6( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
case 7: v02_snd_trans_160_7( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
}
// SND_fm_timer_b_start() ;
break;
case 3: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,4,1);
EGB_digitize(guiEgbPtr,1);
mouse(1);
// SND_fm_timer_b_set( 0, 0 ) ;
switch( wt ){
case 4: v02_snd_trans_192_4( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
case 5: v02_snd_trans_192_5( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
case 6: v02_snd_trans_192_6( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
case 7: v02_snd_trans_192_7( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
}
// SND_fm_timer_b_start() ;
break;
case 4: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,4,1);
EGB_digitize(guiEgbPtr,1);
mouse(1);
// SND_fm_timer_b_set( 0, 0 ) ;
switch( wt ){
case 4: v02_snd_trans_256_4( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
case 5: v02_snd_trans_256_5( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
case 6: v02_snd_trans_256_6( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
case 7: v02_snd_trans_256_7( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
}
// SND_fm_timer_b_start() ;
break;
case 5: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,4,1);
EGB_digitize(guiEgbPtr,1);
mouse(1);
// SND_fm_timer_b_set( 0, 0 ) ;
switch( wt ){
case 4: v02_snd_trans_320_4( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
case 5: v02_snd_trans_320_5( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
case 6: v02_snd_trans_320_6( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
case 7: v02_snd_trans_320_7( snd, frame*800,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break;
}
// SND_fm_timer_b_start() ;
break;
}
/* mute */
int s ;
SND_get_elevol_mute( &s ) ;
SND_elevol_mute( s & 0xfffffff3 ) ;
EGB_digitize(guiEgbPtr,0);
EGB_displayPage(guiEgbPtr,0,0);
EGB_color( guiEgbPtr, 1, 0 ) ;
EGB_clearScreen( guiEgbPtr ) ; /* 画面をきれいにしよう */
for( i=0 ; i<frame*800 ; i++ )
{
if( BYTE( snd+i ) == 0 )
BYTE( snd+i ) = 1 ;
if( BYTE( snd+i ) == 255 )
BYTE( snd+i ) = 254 ;
if( BYTE( snd+i ) < 128 )
BYTE( snd+i ) = 128 - BYTE( snd+i ) ;
}
vd06: if( ( fp = fopen( name, "wb" ) ) == NULL ){
error = 2;
TL_free( snd );
goto vd10;
}
int total, sndp, dtp, bind, fcount, n ;
total = 0 ; sndp = 0 ; dtp = 0 ; bind = 0 ; fcount = 0 ;
for( i=0 ; i<64 ; i++ )DWORD( head + i*4 ) = 0;
DWORD( head ) = 0x32304456; /* ID = VD02 */
DWORD( head + 4 ) = 0 ; /* total length */
DWORD( head + 8 ) = 0 ; /* total frame */
DWORD( head + 12 ) = 6; /* dataの種類番号(bit/ピクセル) */
DWORD( head + 16 ) = v02xd; /* 横 */
DWORD( head + 20 ) = v02yd; /* 縦 */
DWORD( head + 24 ) = wt; /* wait */
DWORD( head + 28 ) = 8; /* バインダ内こま数 */
DWORD( head + 32 ) = 8000*6/wt; /* sound samp. freq */
DWORD( head + 36 ) = 6400; /* バインダ内snd data Byte数 */
if( fwrite( head, 256, 1, fp ) < 1 ){ /* ヘッダー */
error = 2;
goto vd08;
}
if( fwrite( v02tab, 32768+512, 1, fp ) < 1 ){ /* v02 table */
error = 2;
goto vd08;
}
total = total + 32768+512 ;
WORD( data_top + 0 ) = 1 ;
WORD( data_top + 2 ) = 0x2104 ;
DWORD( data_top + 4 ) = 8 + v02xd*v02yd*2*3/8 ;
DWORD( data_top + 8 ) = 1 ;
BYTE( data_top + 12 ) = 0 ;
BYTE( data_top + 13 ) = 0xff ;
WORD( data_top + 14 ) = v02xd*v02yd*2*3/8 ;
for( i=0 ; i<frame ; i += 8 )
{
if( frame - i >= 8 )
n = 8 ;
else
n = frame - i ;
for( j=0 ; j<8 ; j++ )DWORD( bind_head + j*4 ) = 0;
DWORD( bind_head ) = bind;
DWORD( bind_head + 4 ) = 6400 + (16 + v02xd*v02yd*2*3/8)*n ;
if( fwrite( bind_head, 32, 1, fp ) < 1 )
{
error = 2;
goto vd08;
}
if( fwrite( snd + sndp, 6400, 1, fp ) < 1 )
{
error = 2;
goto vd08;
}
sndp += 6400 ;
for( j=0 ; j<n ; j++ )
{
if( fwrite( data_top, 16, 1, fp ) < 1 )
{
error = 2;
goto vd08;
}
if( fwrite(buf+dtp, v02xd*v02yd*2*3/8, 1, fp) < 1 )
{
error = 2;
goto vd08;
}
dtp += v02xd*v02yd*2*3/8 ;
}
total = total + 32 + 6400 + (16 + v02xd*v02yd*2*3/8)*n ;
bind++ ;
fcount += n ;
}
vd08: fseek( fp, 0, SEEK_SET ) ;
DWORD( head + 4 ) = total ; /* total length */
DWORD( head + 8 ) = fcount ; /* total frame */
if( fwrite( head, 256, 1, fp ) < 1 ){ /* ヘッダー */
error = 2;
}
TL_free( snd );
vd09: fclose(fp);
vd10: TL_free( buf );
vd11:
return error;
}
/* サンプリングレート 9600 19200 サポート版(fq=0:9600 fq=1:19200) */
v02_digit_snd_save2( name, frame, md, fq, wt, ytab, ctab, v02tab )
char *name;
int frame, md, fq, wt;
char *ytab, *ctab, *v02tab ;
{
FILE *fp;
int freq ;
int v02xd = 128, v02yd = 96;
int i, j, size, error;
char head[256], bind_head[32], data_top[16] ;
char *buf, *snd, *wk ; /* buffer */
error = 0;
switch( fq ){
case 0: freq = 9600 ;
break;
case 1: freq = 19200 ;
break;
default: return 58 ;
}
switch( md ){
case 1: v02xd = 128; v02yd = 96;
break;
case 2: v02xd = 160; v02yd = 120;
break;
case 3: v02xd = 192; v02yd = 144;
break;
case 4: v02xd = 256; v02yd = 192;
break;
case 5: v02xd = 320; v02yd = 240;
break;
default: return 58 ;
}
size = v02xd*v02yd*2; /* frame size */
if( ( buf = (char *)TL_malloc( size*frame*3/8 + size ) ) == NULL )
{
error = 7;
goto vd11;
}
wk = buf + size*frame*3/8 ;
if( ( snd = (char *)TL_malloc( frame*wt*freq/60 + 20000 ) ) == NULL )
{
error = 7;
goto vd10;
}
for( i=0 ; i<20000-100 ; i += 4 )
DWORD( snd + frame*wt*freq/60 + i ) = 0x80808080 ;
/* 1バインダ(v00タイプなら6400,mvbなら15360)のクッションが必要 */
/* ここでは余裕をみて20K取っている */
switch( md ){
case 1: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,8,1);
EGB_digitize(guiEgbPtr,1);
mouse(1);
switch( freq ){
case 9600:
v02_trans_128_9600( snd, frame*wt*freq/60,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break ;
case 19200:
v02_trans_128_19200( snd, frame*wt*freq/60,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break ;
}
break;
case 2: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,8,1);
EGB_digitize(guiEgbPtr,1);
mouse(1);
switch( freq ){
case 9600:
v02_trans_160_9600( snd, frame*wt*freq/60,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break ;
case 19200:
v02_trans_160_19200( snd, frame*wt*freq/60,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break ;
}
break;
case 3: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,4,1);
EGB_digitize(guiEgbPtr,1);
mouse(1);
switch( freq ){
case 9600:
v02_trans_192_9600( snd, frame*wt*freq/60,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break ;
case 19200:
v02_trans_192_19200( snd, frame*wt*freq/60,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break ;
}
break;
case 4: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,4,1);
EGB_digitize(guiEgbPtr,1);
mouse(1);
switch( freq ){
case 9600:
v02_trans_256_9600( snd, frame*wt*freq/60,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break ;
case 19200:
v02_trans_256_19200( snd, frame*wt*freq/60,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break ;
}
break;
case 5: EGB_displayPage(guiEgbPtr,0,1);
EGB_resolution(guiEgbPtr,0,16);
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,2,4,1);
EGB_digitize(guiEgbPtr,1);
mouse(1);
switch( freq ){
case 9600:
v02_trans_320_9600( snd, frame*wt*freq/60,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break ;
case 19200:
v02_trans_320_19200( snd, frame*wt*freq/60,
buf, frame, wt*320, wt*320 - 320/2,
ytab, ctab, wk ) ;
break ;
}
break;
}
/* mute */
int s ;
SND_get_elevol_mute( &s ) ;
SND_elevol_mute( s & 0xfffffff3 ) ;
EGB_digitize(guiEgbPtr,0);
EGB_displayPage(guiEgbPtr,0,0);
EGB_color( guiEgbPtr, 1, 0 ) ;
EGB_clearScreen( guiEgbPtr ) ; /* 画面をきれいにしよう */
for( i=0 ; i<(frame*wt*freq/60) ; i++ )
{
if( BYTE( snd+i ) == 0 )
BYTE( snd+i ) = 1 ;
if( BYTE( snd+i ) == 255 )
BYTE( snd+i ) = 254 ;
if( BYTE( snd+i ) < 128 )
BYTE( snd+i ) = 128 - BYTE( snd+i ) ;
}
vd06: if( ( fp = fopen( name, "wb" ) ) == NULL ){
error = 2;
TL_free( snd );
goto vd10;
}
int total, sndp, dtp, bind, fcount, n ;
total = 0 ; sndp = 0 ; dtp = 0 ; bind = 0 ; fcount = 0 ;
for( i=0 ; i<64 ; i++ )DWORD( head + i*4 ) = 0;
DWORD( head ) = 0x32304456; /* ID = VD02 */
DWORD( head + 4 ) = 0 ; /* total length */
DWORD( head + 8 ) = 0 ; /* total frame */
DWORD( head + 12 ) = 7; /* dataの種類番号(mvbType) */
DWORD( head + 16 ) = v02xd; /* 横 */
DWORD( head + 20 ) = v02yd; /* 縦 */
DWORD( head + 24 ) = wt; /* wait */
DWORD( head + 28 ) = 8; /* バインダ内こま数 */
DWORD( head + 32 ) = freq; /* sound samp. freq */
DWORD( head + 36 ) = wt*freq/60*8; /* バインダ内snd data Byte数 */
if( fwrite( head, 256, 1, fp ) < 1 ){ /* ヘッダー */
error = 2;
goto vd08;
}
if( fwrite( v02tab, 32768+512, 1, fp ) < 1 ){ /* v02 table */
error = 2;
goto vd08;
}
total = total + 32768+512 ;
WORD( data_top + 0 ) = 1 ;
WORD( data_top + 2 ) = 0x2104 ;
DWORD( data_top + 4 ) = 8 + v02xd*v02yd*2*3/8 ;
DWORD( data_top + 8 ) = 1 ;
BYTE( data_top + 12 ) = 0 ;
BYTE( data_top + 13 ) = 0xff ;
WORD( data_top + 14 ) = v02xd*v02yd*2*3/8 ;
for( i=0 ; i<frame ; i += 8 )
{
if( frame - i >= 8 )
n = 8 ;
else
n = frame - i ;
for( j=0 ; j<8 ; j++ )DWORD( bind_head + j*4 ) = 0;
DWORD( bind_head ) = bind;
DWORD( bind_head + 4 ) = wt*freq/60*8 + (16 + v02xd*v02yd*2*3/8)*n ;
if( fwrite( bind_head, 32, 1, fp ) < 1 )
{
error = 2;
goto vd08;
}
if( fwrite( snd + sndp, wt*freq/60*8, 1, fp ) < 1 )
{
error = 2;
goto vd08;
}
sndp += (wt*freq/60*8) ;
for( j=0 ; j<n ; j++ )
{
if( fwrite( data_top, 16, 1, fp ) < 1 )
{
error = 2;
goto vd08;
}
if( fwrite(buf+dtp, v02xd*v02yd*2*3/8, 1, fp) < 1 )
{
error = 2;
goto vd08;
}
dtp += v02xd*v02yd*2*3/8 ;
}
total = total + 32 + (wt*freq/60*8) + (16 + v02xd*v02yd*2*3/8)*n ;
bind++ ;
fcount += n ;
}
vd08: fseek( fp, 0, SEEK_SET ) ;
DWORD( head + 4 ) = total ; /* total length */
DWORD( head + 8 ) = fcount ; /* total frame */
if( fwrite( head, 256, 1, fp ) < 1 ){ /* ヘッダー */
error = 2;
}
TL_free( snd );
vd09: fclose(fp);
vd10: TL_free( buf );
vd11:
return error;
}